import org.antlr.v4.runtime.tree.ParseTreeProperty;

import java.util.ArrayList;

public class 监听器 extends QBaseListener {

    private final ParseTreeProperty<Object> 标记 = new ParseTreeProperty<>();

    private final 解释器 解释器 = new 解释器();

    @Override
    public void exitTable(QParser.TableContext ctx) {

        var 表名 = ctx.tbl.getText();
        var 主键 = ctx.key.getText();
        var 列名 = new ArrayList<String>();
        列名.add(主键);
        if (ctx.columns != null) {
            for (var 列 : ctx.columns) {
                列名.add(列.getText());
            }
        }

        解释器.创建表(表名, 主键, 列名);
    }

    @Override
    public void exitInsert(QParser.InsertContext ctx) {
        var 表名 = ctx.ID().getText();
        var 行 = new 行();

        for (var setContext : ctx.setFields().set()) {
            var 列名 = setContext.ID().getText();
            var 值 = 标记.get(setContext.expr()).toString();
            行.值.put(列名, 值);
        }

        解释器.插入(表名, 行);
    }


    @Override
    public void exitAssign(QParser.AssignContext ctx) {
        var 变量名 = ctx.ID().getText();
        var 值 = 标记.get(ctx.expr());
        解释器.赋值(变量名, 值);
        标记.put(ctx, 值);
    }

    @Override
    public void exitQuery(QParser.QueryContext ctx) {
        var 表名 = ctx.tbl.getText();
        var 列名 = new ArrayList<String>();
        for (var 列 : ctx.columns) {
            列名.add(列.getText());
        }

        if (ctx.key != null) {
            var 左值 = ctx.key.getText();
            var 右值 = 标记.get(ctx.expr());
            标记.put(ctx, 解释器.查询(表名, 列名, 左值, 右值));
        } else {
            var 结果 = 解释器.查询(表名, 列名);
            标记.put(ctx, 结果);
        }
    }

    @Override
    public void exitPrint(QParser.PrintContext ctx) {
        解释器.输出(标记.get(ctx.expr()));
    }

    @Override
    public void exitExpr(QParser.ExprContext ctx) {
        if (ctx.ID() != null) {
            if (解释器.全局变量.containsKey(ctx.ID().getText())) {
                标记.put(ctx, 解释器.全局变量.get(ctx.ID().getText()));
            } else {
                标记.put(ctx, ctx.ID().getText());
            }
        } else if (ctx.STRING() != null) {
            var 文本 = ctx.STRING().getText();
            标记.put(ctx, 文本.substring(1, 文本.length() - 1));
        } else if (ctx.INT() != null) {
            标记.put(ctx, Integer.parseInt(ctx.INT().getText()));
        } else {
            标记.put(ctx, 标记.get(ctx.query()));
        }
    }
}
